Obj_Print(aObj, aIndent = 0)
{
	static _sLevel := A_Tab
	
	_tabs := "", _reStr := ""
	
	Loop % aIndent
		_tabs .= _sLevel

	if !IsObject(aObj)
	{
		if aObj is number
			return _tabs . aObj
		return _tabs . """" . aObj . """"
	}

	if (Obj_IsPureArray(aObj))
	{
		_reStr .= _tabs . "[`n"

		for _kEach, _vValue in aObj
			_reStr .= Obj_Print(_vValue, aIndent + 1) . ",`n"

		_reStr := RTrim(_reStr, ",`n")

		_reStr .= "`n" _tabs . "]"
	}
	else
	{
		_reStr .= _tabs . "{`n"

		for _kk, _vValue in aObj
		{
			if _kk is not number
				_kk := """" . _kk . """"
			_reStr .= _tabs . _sLevel . _kk " : " Trim(Obj_Print(_vValue, aIndent + 1)) . ",`n"
		}

		_reStr := RTrim(_reStr, ",")

		_reStr .= "`n" _tabs . "}"
	}
	return _reStr
}
Obj_FindValue(aObj, aValue, aIsCaseSensitive = false)
{
	for _kk, _vv in aObj
	{
		if (!aIsCaseSensitive && _vv = aValue)
			return _kk
		else if (aIsCaseSensitive && _vv == aValue)
			return _kk
	}
}
Obj_IsPureArray(aObj, aIsZeroBased = false)
{
	for _kk in aObj
	{
		if (!aIsZeroBased && _kk != A_Index)
		{
			return false
		}
		else if (aIsZeroBased && _kk != (A_Index - 1))
		{
			return false
		}
	}
	return true
}